import math
import utils.baseUtil


def perform_all_calculations(params):
    results = {}

    try:
        # 1. 放线段控制张力计算
        results['正常放线承力绳张力'] = calculate_control_tension(
            params['跨越架待放线单位长度重量'], params['控制档档距'],
            params['跨越架跨越物与承载索高侧悬点平距'], params['净空距离'],
            params['悬挂点高差'], params['跨越架高差'], params['控制档高差角']
        )
    except Exception as e:
        print(f"Error calculating 控制张力: {e}")

    # 其他计算步骤类似，每个步骤都包含异常处理...

    return results

# 其他计算函数保持不变，如calculate_control_tension, calculate_weight_length等
import math


def bfloats(*args):
    """将输入的浮点数转换为float类型"""
    return tuple(float(arg) for arg in args)


# 1. 放线段控制张力计算
def calculate_control_tension(omega, length, x, y, n, h, phi_deg):
    """
    计算放线段控制张力
    :param omega: 导线单位长度自重 (N/m)
    :param length: 控制档档距 (m)
    :param x: 被跨越物距离最近铁塔放线滑车悬挂点的水平距离 (m)
    :param y: 净空距离 (m)
    :param n: 跨越物最近铁塔放线滑车悬挂点高差 (m)
    :param h: 跨越档两悬挂点高差 (m)
    :param phi_deg: 控制档高差角 (°)，最近塔低取"+"值，反之取"-"
    :return: 控制张力 H (N)
    """
    omega, length, x, y, n, h, phi_deg = bfloats(omega, length, x, y, n, h, phi_deg)
    phi_rad = math.atan(h / length)  # 计算高差角（弧度）
    denominator = 2 * (n - y) * math.cos(phi_rad) - 2 * n * math.sin(phi_rad)
    h_tension = (omega * x * (length - x)) / denominator
    return h_tension


# 2. 跨越点处导地线风偏计算
def calculate_weight_length(d, K):
    """
    计算单位长度风荷载 ω4(10)
    :param d: 外径 (mm)
    :param K: 风载体型系数
    :return: 单位长度风荷载 ω4(10) (N/m)
    """
    d, K = bfloats(d, K)
    omega4_10 = 0.0613 * K * d
    return omega4_10


def calculate_mid_phase_wind_deflection(omega1, lambda_, l, x, H, d, K):
    """
    计算中相风偏
    :param omega1: 单位长度的自重力 (N/m)
    :param lambda_: 施工线路跨越档两端绝缘子串长度 (m)
    :param l: 跨越档档距 (m)
    :param x: 高速公路中心距近跨越铁塔中心的距离 (m)
    :param H: 水平放线张力 (N)
    :param d: 外径 (mm)
    :param K: 风载体型系数
    :return: 中相风偏 Zx (m)
    """
    omega1, lambda_, l, x, H, d, K = bfloats(omega1, lambda_, l, x, H, d, K)
    omega4_10 = calculate_weight_length(d, K)
    Zx = omega4_10 * (lambda_ / omega1 + (x * (l - x)) / (2 * H))
    return round(Zx, 2)


def calculate_side_phase_wind_deflection(omega1, lambda_, l, x, H, d, K):
    """
    计算边相风偏
    :param omega1: 单位长度的自重力 (N/m)
    :param lambda_: 施工线路跨越档两端绝缘子串长度 (m)
    :param l: 跨越档档距 (m)
    :param x: 高速公路中心距近跨越铁塔中心的距离 (m)
    :param H: 水平放线张力 (N)
    :param d: 外径 (mm)
    :param K: 风载体型系数
    :return: 边相风偏 Zx (m)
    """
    return calculate_mid_phase_wind_deflection(omega1, lambda_, l, x, H, d, K)


# 3. 跨越架体宽度计算
def calculate_mid_phase_crossing_width(omega1, lambda_, l, x, H, d, K):
    """
    计算中相绝缘网宽度
    :param omega1: 单位长度的自重力 (N/m)
    :param lambda_: 施工线路跨越档两端绝缘子串长度 (m)
    :param l: 跨越档档距 (m)
    :param x: 跨越架跨越物与承载索高侧悬点平距 (m)
    :param H: 水平放线张力 (N)
    :param d: 外径 (mm)
    :param K: 风载体型系数
    :return: 中相绝缘网宽度 B (m)
    """
    Zx = calculate_mid_phase_wind_deflection(omega1, lambda_, l, x, H, d, K)
    B = (2 * Zx + x)
    return round(B, 2)


def calculate_mid_phase_selected_crossing_width(Zx, b):
    """
    计算中相绝缘网选定宽度
    :param Zx: 中相选定风偏 (m)
    :param b: 跨越架跨越物与承载索高侧悬点平距 (m)
    :return: 中相绝缘网选定宽度 B (m)
    """
    Zx, b = bfloats(Zx, b)
    B = (2 * Zx + b)
    return round(B, 2)


def calculate_side_phase_crossing_width(omega1, lambda_, l, x, H, d, K):
    """
    计算边相绝缘网宽度
    :param omega1: 单位长度的自重力 (N/m)
    :param lambda_: 施工线路跨越档两端绝缘子串长度 (m)
    :param l: 跨越档档距 (m)
    :param x: 跨越架跨越物与承载索高侧悬点平距 (m)
    :param H: 水平放线张力 (N)
    :param d: 外径 (mm)
    :param K: 风载体型系数
    :return: 边相绝缘网宽度 B (m)
    """
    Zx = calculate_side_phase_wind_deflection(omega1, lambda_, l, x, H, d, K)
    B = (2 * Zx + x)
    return round(B, 2)


def calculate_side_phase_selected_crossing_width(Zx, b):
    """
    计算边相绝缘网选定宽度
    :param Zx: 边相选定风偏 (m)
    :param b: 边相跨越架跨越物与承载索高侧悬点平距 (m)
    :return: 边相绝缘网选定宽度 B (m)
    """
    Zx, b = bfloats(Zx, b)
    B = (2 * Zx + b)
    return round(B, 2)


# 4. 封网长度计算
def calculate_mid_phase_net_length(omega1, lambda_, l, x, H, d, K, alpha):
    """
    计算中相绝缘网长度
    :param omega1: 单位长度的自重力 (N/m)
    :param lambda_: 施工线路跨越档两端绝缘子串长度 (m)
    :param l: 跨越档档距 (m)
    :param x: 跨越架跨越物与承载索高侧悬点平距 (m)
    :param H: 水平放线张力 (N)
    :param d: 外径 (mm)
    :param K: 风载体型系数
    :param alpha: 交叉跨越角 (°)
    :return: 中相绝缘网长度 Lw (m)
    """
    B = calculate_mid_phase_crossing_width(omega1, lambda_, l, x, H, d, K)
    Lw = B / math.sin(math.radians(alpha))
    return round(Lw, 2)


def calculate_mid_phase_selected_net_length(Zx, gamma, b, alpha):
    """
    计算中相绝缘网选定长度
    :param Zx: 中相选定风偏 (m)
    :param gamma: 跨越架体宽度系数
    :param b: 跨越架跨越物与承载索高侧悬点平距 (m)
    :param alpha: 交叉跨越角 (°)
    :return: 中相绝缘网选定长度 Lw (m)
    """
    B = calculate_mid_phase_selected_crossing_width(Zx, gamma)
    Lw = B / math.sin(math.radians(alpha))
    return round(Lw, 2)


def calculate_side_phase_net_length(omega1, lambda_, l, x, H, d, K, gamma, alpha):
    """
    计算边相绝缘网长度
    :param omega1: 单位长度的自重力 (N/m)
    :param lambda_: 施工线路跨越档两端绝缘子串长度 (m)
    :param l: 跨越档档距 (m)
    :param x: 跨越架跨越物与承载索高侧悬点平距 (m)
    :param H: 水平放线张力 (N)
    :param d: 外径 (mm)
    :param K: 风载体型系数
    :param gamma: 跨越架体宽度系数
    :param alpha: 交叉跨越角 (°)
    :return: 边相绝缘网长度 Lw (m)
    """
    B = calculate_side_phase_crossing_width(omega1, lambda_, l, x, H, d, K)
    Lw = B / math.sin(math.radians(alpha))
    return round(Lw, 2)


def calculate_side_phase_selected_net_length(Zx, b, alpha):
    """
    计算边相绝缘网选定长度
    :param Zx: 边相选定风偏 (m)
    :param b: 边相跨越架跨越物与承载索高侧悬点平距 (m)
    :param alpha: 交叉跨越角 (°)
    :return: 边相绝缘网选定长度 Lw (m)
    """
    B = calculate_side_phase_selected_crossing_width(Zx, b)
    Lw = B / math.sin(math.radians(alpha))
    return round(Lw, 2)


def calculate_crossing_frame_net_length(omega1_mid, lambda_, l, x, H, d, K, gamma_mid, omega1_side, gamma_side):
    """
    计算跨越架封网长度C
    :param omega1_mid: 单位长度的自重力 (N/m) - 中相
    :param lambda_: 施工线路跨越档两端绝缘子串长度 (m)
    :param l: 跨越档档距 (m)
    :param x: 跨越架跨越物与承载索高侧悬点平距 (m)
    :param H: 水平放线张力 (N)
    :param d: 外径 (mm)
    :param K: 风载体型系数
    :param gamma_mid: 中相绝缘网宽度_跨越架体宽度系数
    :param omega1_side: 单位长度的自重力 (N/m) - 边相
    :param gamma_side: 边相绝缘网宽度_跨越架体宽度系数
    :return: 跨越架封网长度C (m)
    """
    Bk = calculate_mid_phase_crossing_width(omega1_mid, lambda_, l, x, H, d, K)
    Bw = calculate_side_phase_crossing_width(omega1_side, lambda_, l, x, H, d, K)
    C_new = Bk + Bw
    return round(C_new, 2)


def calculate_protection_distance(Ba, alpha):
    """
    计算跨越架伸出被跨越高速的保护距离
    :param Ba: 被跨越宽度 (m)
    :param alpha: 交叉跨越角 (°)
    :return: 保护距离 Lb (m)
    """
    Ba, alpha = bfloats(Ba, alpha)
    alpha_rad = math.radians(alpha)
    Lb = Ba / (2 * math.tan(alpha_rad))
    return round(Lb, 2)


def calculate_total_net_length(omega1_mid, lambda_, l, x, H, d, K, gamma_mid, omega1_side, gamma_side, alpha, Ba):
    """
    计算封网总长度
    :param omega1_mid: 单位长度的自重力 (N/m) - 中相
    :param lambda_: 施工线路跨越档两端绝缘子串长度 (m)
    :param l: 跨越档档距 (m)
    :param x: 跨越架跨越物与承载索高侧悬点平距 (m)
    :param H: 水平放线张力 (N)
    :param d: 外径 (mm)
    :param K: 风载体型系数
    :param gamma_mid: 中相绝缘网宽度_跨越架体宽度系数
    :param omega1_side: 单位长度的自重力 (N/m) - 边相
    :param gamma_side: 边相绝缘网宽度_跨越架体宽度系数
    :param alpha: 交叉跨越角 (°)
    :param Ba: 被跨越宽度 (m)
    :return: 封网总长度 Lw (m)
    """
    Bk = calculate_mid_phase_crossing_width(omega1_mid, lambda_, l, x, H, d, K)
    Bw = calculate_side_phase_crossing_width(omega1_side, lambda_, l, x, H, d, K)
    Lb = calculate_protection_distance(Ba, alpha)
    Lw = (Bk / math.sin(math.radians(alpha))) + (Bw / math.sin(math.radians(alpha))) + 2 * Lb
    return round(Lw, 2)


# 5. 跨越架高度计算
def calculate_crossing_height(Hmin, HG, f):
    """
    计算跨越架高度
    :param Hmin: 最小跨越架高度 (m)
    :param HG: 跨越架离地面高度 (m)
    :param f: 弧垂 (m)
    :return: 跨越架高度 HK (m)
    """
    Hmin, HG, f = bfloats(Hmin, HG, f)
    HK = Hmin + HG + f
    return HK


# 6. 放线张力跨越架封顶网计算
def calculate_sag_empty(omega1, lambda_, H0, phi):
    """
    计算空载情况下主绳弧垂
    :param omega1: 单位长度的自重力 (N/m)
    :param lambda_: 封网长度 (m)
    :param H0: 空载状态水平张力 (N)
    :param phi: 跨越架两侧高差角 (°)
    :return: 空载情况下主绳弧垂 f1 (m)
    """
    omega1, lambda_, H0, phi = bfloats(omega1, lambda_, H0, phi)
    phi_rad = math.radians(phi)
    f1 = (omega1 * lambda_ ** 2) / (8 * H0 * math.cos(phi_rad))
    return round(f1, 2)


def calculate_sag_installed(omega2, lambda_, H1, phi):
    """
    计算安装后的弧垂
    :param omega2: 网架主绳叠加网架安装装置单位长度重量 (N/m)
    :param lambda_: 封网长度 (m)
    :param H1: 架安装后主绳水平张力 (N)
    :param phi: 跨越架两侧高差角 (°)
    :return: 封网安装后网架弧垂 f2 (m)
    """
    omega2, lambda_, H1, phi = bfloats(omega2, lambda_, H1, phi)
    phi_rad = math.radians(phi)
    f2 = (omega2 * lambda_ ** 2) / (8 * H1 * math.cos(phi_rad))
    return round(f2, 2)


def calculate_sag_accident(omega3, lambda_, H2, phi):
    """
    计算事故状态下的弧垂
    :param omega3: 事故状态总重量 (N/m)
    :param lambda_: 跨度 (m)
    :param H2: 水平张力 (N)
    :param phi: 跨越架两侧高差角 (°)
    :return: 事故状态下网架弧垂 f3 (m)
    """
    omega3, lambda_, H2, phi = bfloats(omega3, lambda_, H2, phi)
    phi_rad = math.radians(phi)
    f3 = (omega3 * lambda_ ** 2) / (8 * H2 * math.cos(phi_rad))
    return round(f3, 2)


# 7. 跨越架拉线计算
def calculate_wind_pressure(k, V, Ac):
    """
    计算跨越架全面风压
    :param k: 风载体系数
    :param V: 计算风速 (m/s)
    :param Ac: 架面杆件整体投影面积 (m²)
    :return: 跨越架全面风压 HF (N)
    """
    k, V, Ac = bfloats(k, V, Ac)
    HF = 9.81 * k * (V ** 2 / 16) * Ac
    return HF


# 集成计算函数
def perform_all_calculations(params):
    results = {}

    try:
        # 1. 放线段控制张力计算
        results['正常放线承力绳张力'] = calculate_control_tension(
            params['跨越架待放线单位长度重量'], params['控制档档距'],
            params['跨越架跨越物与承载索高侧悬点平距'], params['净空距离'],
            params['悬挂点高差'], params['跨越架高差'], params['控制档高差角']
        )
    except Exception as e:
        print(f"Error calculating 控制张力: {e}")

    # 其他计算步骤类似，每个步骤都包含异常处理...
    # 为了简洁，此处省略了其他计算步骤的异常处理代码，但在实际代码中应当包含

    return results


# 示例参数字典
params = {
    '跨越架待放线单位长度重量': 1.5,  # 单位：kg/km，转换为N/m需要乘以9.81
    '控制档档距': 300,  # 单位：m
    '跨越架跨越物与承载索高侧悬点平距': 50,  # 单位：m
    '净空距离': 20,  # 单位：m
    '悬挂点高差': 10,  # 单位：m
    '跨越架高差': 15,  # 单位：m
    '控制档高差角': 30,  # 单位：度
    # 其他参数...
}

# 调用集成函数
results = perform_all_calculations(params)
print(results)